<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 继承 ： 子类会继承父类的属性和方法 。

        // ES5的继承 

        // 1.构造函数的继承 
        // function Dad(age,hobby){
        //     this.name = "张三";
        //     this.age = age;
        //     this.hobby = hobby
        // }


        // function Son(age,hobby){
        //     // call  apply bind 
        //     // Dad.call(this,age,hobby);
        //     // Dad.apply(this,[age,hobby]);
        //     Dad.bind(this)(age,hobby);
        //     this.height = "178cm";
        // }


        // let zhangsi = new Son(56,"篮球");
        // console.log(zhangsi)





        // function myfn(){
        //     console.log(111)
        //     return function(){
        //         console.log(222)
        //         return function(){
        //             console.log(333);
        //         }
        //     }
        // }
        // myfn()()();


        // 2.原型的继承
        // function Dad(age,hobby){
        //     this.name = "张三";
        //     this.age = age;
        //     this.hobby = hobby
        // }

        // Dad.prototype.fn = function(){
        //     console.log("fn");
        // }

        // function Son(age,hobby){
        //     Dad.bind(this)(age,hobby);
        //     this.height = "178cm";
        // }

        // // Son.prototype = Dad.prototype;  // 直接赋值 ，造成引用问题
        // function Link(){}
        // Link.prototype = Dad.prototype;
        // Son.prototype = new Link();
        // Son.prototype.constructor = Son;

        // Son.prototype.fn = function(){
        //     console.log("son-fn");
        // }

        // let zhangsi = new Son(56,"篮球");
        // // console.log(zhangsi)
        // zhangsi.fn();

        // let  dad = new Dad(54,"足球");
        // dad.fn();


        // var arr = {};
        // // 判断数据类型
        // if(arr.constructor===Array){
        //     console.log("是数组");
        // }else{
        //     console.log("不是数组");
        // }



        // ES6的继承  关键字 extends  : 扩展
        // class Dad{
        //     constructor(age,hobby){
        //         this.name = "张三";
        //         this.age = age;
        //         this.hobby = hobby;
        //     }
        //     fn(){
        //         console.log("fn")
        //     }
        // }

        // class Son extends Dad{

        // }

        // let zhangsi = new Son(56,"篮球");
        // console.log(zhangsi)
        // zhangsi.fn();


        // super关键字 
        // 1.如果子类 没有写 constructor ，那么可以省略 super关键字
        // 2.如果子类有 constructor ，那么 在继承的时候 需要写上super关键字
        // 3. super函数可以给父类传参；super不能单独存在；
        // 4. super 必须存在于子类 ，必须在使用this之前调用super方法
        // 5.super可以调用父类的方法； super.父类方法();
        class Dad{
            constructor(age,hobby){
                this.name = "张三";
                this.age = age;
                this.hobby = hobby;
            }
            fn(){
                console.log("fn")
            }
            myfn(){
                console.log("我是myfn函数，父类的");
            }
        }

        class Son extends Dad{
            constructor(age,hobby){
                super(age,hobby);
                // console.log(super);
                
                this.height = "178cm";
            }
            sonfn(){
                console.log("我是sonfn方法");
                super.myfn();  // 通过super 调用了父类的 myfn方法；
            }
        }

        let zhangsi = new Son(55,"篮球");
        console.log(zhangsi);
        zhangsi.sonfn();
    </script>
</body>
</html>